package com.ftg.learn.chapter15;

import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @author kangjx
 * @createTime 2022/8/22
 */
public class LearnMap {

    //主线程 主函数 主方法
    public static void main(String[] args) {
        //底层 结构   大致原码
        Map<String,Object> map = new HashMap<>(4);
//        //数组+链表+红黑树  遍历 的速度 快于hashtable
////        key 为空 hash 0  value 直接存储
//        map.put(null,null);
//        System.out.println(map.get(null));
//        //默认16 0 1  hashtable 默认11 为1
//        Map<String,Object> map1 = new Hashtable<>(3);
//        // 线程安全的  synchronized 速度
//        //数组+链表
////        Hashtable key也value不能这空
//        map1.put(null,"abc");
//        ConcurrentHashMap // 创建了一个空的node[]  node implement map.entry
        //stream
        Map<String,Object> map2 = new ConcurrentHashMap<>();
        map2.put("name","abc");

        map2.get("name");


        // 1 : map2.put("name","abc");
        // 2 : initTable() 帮我们化了一个16长度的node数组
        // 3 : f = tabAt(tab, i = (n - 1) & hash) 当前下标里面是否有元素 ，如果没有
        // 4 : casTabAt(tab, i, null,new Node<K,V>(hash, key, value, null))  把这个下标用 new node(hash,key,value,next) 存储到当前下标



//        private final ConcurrentHashMap.Node<K,V>[] initTable() {
//            ConcurrentHashMap.Node<K,V>[] tab = null;
//            int sc = 0;
//            while ((tab = table) == null || tab.length == 0) {//第一执行put方法
////                if ((sc = sizeCtl) < 0)
////                    Thread.yield(); // lost initialization race; just spin
////                else if (U.compareAndSwapInt(this, SIZECTL, sc, -1)) {
//                    try {
//                        if ((tab = table) == null || tab.length == 0) {
//                            //n 新长度  DEFAULT_CAPACITY  16
//                            int n = (sc > 0) ? sc : DEFAULT_CAPACITY;
//
//                            @SuppressWarnings("unchecked")
//                            // ConcurrentHashMap.Node<?,?>[n] 数组长度为16
//                            ConcurrentHashMap.Node<K,V>[] nt = (ConcurrentHashMap.Node<K,V>[])new ConcurrentHashMap.Node<?,?>[n];
//                            table = tab = nt;
//
//                            sc = n - (n >>> 2);
//                        }
//                    } finally {
//                        sizeCtl = sc;
//                    }
//                    break;
////                }
//            }
//            return tab;
//        }

        //分段锁

        //悲观锁


        //乐观锁

        //synchronized :  线程 进程(包含致一个线程) --> 专题 粗 细
        // 锁 : 线程锁  公平锁
        //synchronized ： 互斥 排它

        //四口全饿了 四 -> synchronized eat(窝窝头) --> [1 --> 1水] ->> 释放 -->   窝窝头1个


    }



}
